在 Day 3 時提到,在 ROS 系統中套件(Package)是開發機器人軟體的最基本單位,這篇要來實際跑一遍建立套件的流程。
不過這個過程稍微複雜一些,若只是開發練習用或小型專案,可以省略這個步驟。如果想要直接開始寫 ROS 節點,可以直接看下一篇。
在建立套件之前,需要先建立一個工作區(Workspace)。工作區是用來給管理 ROS 專案的特殊資料夾,專案內使用或建立的套件、各種檔案都會放在裡面。
我們需要使用 catkin 這套建立與管理工具,它會為一個普通的資料夾自動生成各種必須的資訊,將其轉換成 ROS 工作區,以利後續的開發工作。這個工作區一般只要建立一次即可。
建立 catkin workspace:
在終端機輸入以下指令,系統會在 home
目錄新建一個名為 catkin_ws
目錄(也可以取其他名稱,通常都會用 _ws
結尾 ),並在其中創建一個 src
資料夾。
$ mkdir -p ~/catkin_ws/src
編譯整個工作區:
回到 catkin_ws
目錄,透過 catkin_make
指令讓 catkin 編譯此目錄下所有的 ROS 專案,為所有 ROS 套件自動生成可執行文件、函式庫和其他必要的檔案。
$ cd ~/catkin_ws/
$ catkin_make
第一次執行該指令後,會看到 catkin_ws
目錄中多了 build
和 devel
這兩個目錄,原本的 src
目錄裡面也新增了一個 CMakeLists.txt
的檔案。
catkin_ws
目錄內的東西:
src
(Source Space):src
是給開發者用來放各項專案和套件的地方。而方才新增的CMakeLists.txt
是 catkin 結合了 CMake 系統(一種跨平台自動化建構系統,是「Cross-platform Make」的縮寫),讓程式可以支援跨平台建置的組態文件。
build
(Build Space):build
是一個臨時目錄,用於存放執行catkin_make
過程中生成的中間檔案。
devel
(Development Space):devel
這個目錄包含了 ROS 套件的建構結果,例如可執行檔、函式庫、標頭檔等。
設置環境變數:
編譯完成後,需要輸入 source ~/.bashrc
指令將工作區的環境變數載入到當前的 shell 中。
如果如果你希望每次打開終端機時,都可以自動載入這個工作區的環境變數,可以執行 echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
這行指令,將前一條指令加入~/.bashrc
檔案中。 這樣每次開啟新的終端機時,都可以直接執行 ROS 指令。
$ source devel/setup.bash
$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
catkin_create_pkg
建立套件每次建立一個全新的 ROS 套件,可以按照以下步驟:
前往 catkin_ws/src
,利用 catkin 工具的 catkin_create_pkg
指令來建立套件。
格式:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
<package_name>
:自己定義的套件名稱。[depend1]
:建立套件時預先設定好一系列相依套件。這裡示範建立一個名為 my_package
的套件,並且設定幾個相依套件:std_msgs
(設定標準的訊息資料結構)、rospy
(可以用 Python 撰寫節點)、roscpp
(可以用 C++ 撰寫節點)。
$ catkin_create_pkg my_package std_msgs rospy roscpp
查看 my_package
目錄中可以看到檔案結構如下:
~/catkin_ws/src/my_package$ tree
.
├── CMakeLists.txt
├── package.xml
└── src
CMakeLists.txt
:這是 ROS 自動生成給 CMake 建置用的文件,除了整個 catkin workspace 有一個外,每一個套件自己也會有一個。
package.xml
:這是 ROS 自動生成的套件清單(Package Manifests),用於描述 ROS 套件的詮釋資料檔(Metadata file),它會包含套件名稱、版本、作者資訊、有哪些相依套件等。
src
:這是用於儲存套件程式碼的地方。
這時回到 catkin_ws
目錄,再次執行 catkin_make
指令,會顯示以下資訊,代表已經為剛才建立的 my_package
套件建立好必須的相依套件了。
$ catkin_make
# ...前面省略
-- Found PythonInterp: /usr/bin/python3 (found version "3.8.10")
-- Using Python nosetests: /usr/bin/nosetests3
-- catkin 0.8.10
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~ traversing 1 packages in topological order:
-- ~~ - my_package
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'my_package'
-- ==> add_subdirectory(my_package)
-- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
-- Configuring done
-- Generating done
# ...後面省略
之後如果有對套件做較大幅度的修改,最好都回到工作區執行一次 catkin_make
指令。
在 ROS index 和 GitHub 上也可以找到不少套件可用,這裡找一個教學用專案 Two wheeled robot 來示範如何安裝。
下載專案到工作區的 src
目錄底下。這個專案裡面包含了 m2wr_description
和 m2wr_motion_plan
兩個套件。
$ cd ~/catkin_ws/src
$ git clone https://github.com/sulibo/two_wheeled_robot_ROS_tutorial.git
安裝相依套件後,回到工作區目錄執行編譯。
$ cd ..
$ rosdep install --from-paths src --ignore-src -r
$ catkin_make
執行完上列步驟後,可以執行以下指令,這會開啟 Gazebo 模擬器(在更後面的文章會詳細介紹),並且在模擬環境中載入一台兩輪小車機器人。
$ roslaunch m2wr_description spawn.launch
雖然這一篇建立的套件看起來不怎麼複雜,只有 src
是開發者真的會用到的部份,但是我覺得 ROS 的套件其實是個滿複雜的概念。從上面 Two wheeled robot 套件的目錄就可以看到一個完整的套件裡還有更多東西,其中幾個部份我會在之後跑模擬環境時再詳細介紹。
下一篇會來講怎麼寫 ROS 節點,真的可以開始寫程式了。